Cloudflare Workersを使って営業時間外はアクセスできないようにしたい
前提
ALB + EC2 + RDS の一般的なWebアプリケーションの構成の社内アプリケーションがあります。
利用費をケチるため、アプリにアクセスできる時間を制限するため、以下のことをOpswitchを使って行っています
- Auto Scaling グループでキャパを0にする
- RDSを停止する
外形監視は常に行なっている状態。
困っていたこと
時間外だとEC2インスタンスが起動していないので、アプリケーションにはアクセスできませんが、ELB 5XXsがカウントされてしまっています。稼働率の計算に5XXsの数を使っていて、計算が面倒になって嫌だったのでA、時間外はLBにアクセスさせないようにする仕組みが欲しい。
対応した方法
Cloudflareを使っているので、Cloudflare Workersを利用して、時間帯に基づいてアクセスを制御をすることにしました。
Workersの無料プランでは、1日あたり10万件のリクエスト(Workersスクリプト全体、UTC+0)まで行けるので、社内アプリケーションにはじゅうぶんでした。
Cloudflare Workersは、強力なサーバーレスアプリケーションを構築できます
具体的には、Cloudflare Workersでリクエストを受け取り、時間外であればアクセスを制限し、特定のステータスコード(例えば503や403)を返すようにします。
手順1: Cloudflare Workersのセットアップ
-
Cloudflareアカウントにログイン
まず、Cloudflareにログインします
-
ドメインを選択:
Cloudflareのダッシュボードから、Workersを紐付けたいドメインを選択します。
-
Workersの作成:
選択したドメインの設定ページに移動し、「Workers」タブを選択します。
「作成」や「ワーカーの作成」ボタンをクリックし、Workerを作成します。 -
Workerのスクリプトを作成:
Workersのエディタで、スクリプトを作成します。以下は例として、営業時間外のアクセスを制限するスクリプトです
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const now = new Date()
const hour = (now.getUTCHours() + 9) % 24
// 例: 営業時間を9:00〜17:00 JSTCに設定
if (hour < 9 || hour >= 17) {
return new Response('営業時間外のアクセスです(9:00〜17:00)。またのご来場をお待ちしております。', { status: 503 })
}
// 営業時間内の場合、リクエストを通常通り処理
return fetch(request)
}
手順2: ルートハンドリングの設定
作成したWorkersのページに行き、設定タブをクリックします。
その後、「トリガー」ボタンをクリックします。
「ルートを追加」ボタンをクリックします。
「ルートを追加」ボタンをクリックすると保存できます。
表示されたフォームにルートを入力します。
たとえば、example.com/ と入力すると、example.com 以下のすべてのURLに対してWorkerが実行されます。
「ゾーン」に はワーカーを適用したいドメインを選択します。
これで、指定したルートに対してCloudflare Workerが適用されるようになります。設定後は、そのルートにアクセスがあった場合にWorkerが自動的にトリガーされ、設定したスクリプトが実行されます。